64
65
static void gimp_procedure_free_strings (GimpProcedure *procedure);
65
66
static gboolean gimp_procedure_validate_args (GimpProcedure *procedure,
67
GimpProgress *progress,
68
67
GParamSpec **param_specs,
69
68
gint n_param_specs,
71
gboolean return_vals);
74
74
G_DEFINE_TYPE (GimpProcedure, gimp_procedure, GIMP_TYPE_OBJECT)
136
136
if (! procedure->static_strings)
138
if (procedure->original_name)
139
memsize += strlen (procedure->original_name) + 1;
141
if (procedure->blurb)
142
memsize += strlen (procedure->blurb) + 1;
145
memsize += strlen (procedure->help) + 1;
147
if (procedure->author)
148
memsize += strlen (procedure->author) + 1;
150
if (procedure->copyright)
151
memsize += strlen (procedure->copyright) + 1;
154
memsize += strlen (procedure->date) + 1;
156
if (procedure->deprecated)
157
memsize += strlen (procedure->deprecated) + 1;
138
memsize += gimp_string_get_memsize (procedure->original_name);
139
memsize += gimp_string_get_memsize (procedure->blurb);
140
memsize += gimp_string_get_memsize (procedure->help);
141
memsize += gimp_string_get_memsize (procedure->author);
142
memsize += gimp_string_get_memsize (procedure->copyright);
143
memsize += gimp_string_get_memsize (procedure->date);
144
memsize += gimp_string_get_memsize (procedure->deprecated);
160
147
memsize += procedure->num_args * sizeof (GParamSpec *);
174
161
static GValueArray *
175
gimp_procedure_real_execute (GimpProcedure *procedure,
177
GimpContext *context,
178
GimpProgress *progress,
162
gimp_procedure_real_execute (GimpProcedure *procedure,
164
GimpContext *context,
165
GimpProgress *progress,
181
169
g_return_val_if_fail (args->n_values >= procedure->num_args, NULL);
183
171
return procedure->marshal_func (procedure, gimp,
184
172
context, progress,
189
gimp_procedure_real_execute_async (GimpProcedure *procedure,
191
GimpContext *context,
192
GimpProgress *progress,
177
gimp_procedure_real_execute_async (GimpProcedure *procedure,
179
GimpContext *context,
180
GimpProgress *progress,
196
184
GValueArray *return_vals;
185
GError *error = NULL;
198
187
g_return_if_fail (args->n_values >= procedure->num_args);
252
249
gimp_procedure_set_static_strings (GimpProcedure *procedure,
253
gchar *original_name,
250
const gchar *original_name,
254
const gchar *copyright,
256
const gchar *deprecated)
261
258
g_return_if_fail (GIMP_IS_PROCEDURE (procedure));
263
260
gimp_procedure_free_strings (procedure);
265
procedure->original_name = original_name;
266
procedure->blurb = blurb;
267
procedure->help = help;
268
procedure->author = author;
269
procedure->copyright = copyright;
270
procedure->date = date;
271
procedure->deprecated = deprecated;
262
procedure->original_name = (gchar *) original_name;
263
procedure->blurb = (gchar *) blurb;
264
procedure->help = (gchar *) help;
265
procedure->author = (gchar *) author;
266
procedure->copyright = (gchar *) copyright;
267
procedure->date = (gchar *) date;
268
procedure->deprecated = (gchar *) deprecated;
273
270
procedure->static_strings = TRUE;
302
gimp_procedure_execute (GimpProcedure *procedure,
304
GimpContext *context,
305
GimpProgress *progress,
299
gimp_procedure_execute (GimpProcedure *procedure,
301
GimpContext *context,
302
GimpProgress *progress,
308
GValueArray *return_vals = NULL;
306
GValueArray *return_vals;
307
GError *pdb_error = NULL;
310
309
g_return_val_if_fail (GIMP_IS_PROCEDURE (procedure), NULL);
311
310
g_return_val_if_fail (GIMP_IS_GIMP (gimp), NULL);
312
311
g_return_val_if_fail (GIMP_IS_CONTEXT (context), NULL);
313
312
g_return_val_if_fail (progress == NULL || GIMP_IS_PROGRESS (progress), NULL);
314
313
g_return_val_if_fail (args != NULL, NULL);
314
g_return_val_if_fail (error == NULL || *error == NULL, NULL);
316
if (! gimp_procedure_validate_args (procedure, gimp, progress,
316
if (! gimp_procedure_validate_args (procedure,
317
317
procedure->args, procedure->num_args,
318
args, FALSE, &pdb_error))
320
return_vals = gimp_procedure_get_return_values (procedure, FALSE);
321
g_value_set_enum (return_vals->values, GIMP_PDB_CALLING_ERROR);
320
return_vals = gimp_procedure_get_return_values (procedure, FALSE,
322
g_propagate_error (error, pdb_error);
323
324
return return_vals;
333
/* If there are no return arguments, assume an execution error */
336
return_vals = gimp_procedure_get_return_values (procedure, FALSE);
337
g_value_set_enum (return_vals->values, GIMP_PDB_EXECUTION_ERROR);
338
if (g_value_get_enum (&return_vals->values[0]) != GIMP_PDB_SUCCESS)
340
/* If the error has not already been set, construct one
341
* from the error message that is optionally passed with
344
if (error && *error == NULL)
346
if (return_vals->n_values > 1 &&
347
G_VALUE_HOLDS_STRING (&return_vals->values[1]))
349
g_set_error (error, 0, 0,
350
g_value_get_string (&return_vals->values[1]));
357
g_warning ("%s: no return values, shouldn't happen", G_STRFUNC);
359
pdb_error = g_error_new (GIMP_PDB_ERROR, GIMP_PDB_INVALID_RETURN_VALUE,
360
_("Procedure '%s' returned no return values"),
361
gimp_object_get_name (GIMP_OBJECT (procedure)));
363
return_vals = gimp_procedure_get_return_values (procedure, FALSE,
365
if (error && *error == NULL)
366
g_propagate_error (error, pdb_error);
368
g_error_free (pdb_error);
342
372
return return_vals;
346
gimp_procedure_execute_async (GimpProcedure *procedure,
348
GimpContext *context,
349
GimpProgress *progress,
376
gimp_procedure_execute_async (GimpProcedure *procedure,
378
GimpContext *context,
379
GimpProgress *progress,
353
384
g_return_if_fail (GIMP_IS_PROCEDURE (procedure));
354
385
g_return_if_fail (GIMP_IS_GIMP (gimp));
356
387
g_return_if_fail (progress == NULL || GIMP_IS_PROGRESS (progress));
357
388
g_return_if_fail (args != NULL);
358
389
g_return_if_fail (display == NULL || GIMP_IS_OBJECT (display));
390
g_return_if_fail (error == NULL || *error == NULL);
360
if (gimp_procedure_validate_args (procedure, gimp, progress,
392
if (gimp_procedure_validate_args (procedure,
361
393
procedure->args, procedure->num_args,
364
396
GIMP_PROCEDURE_GET_CLASS (procedure)->execute_async (procedure, gimp,
365
397
context, progress,
392
424
gimp_procedure_get_return_values (GimpProcedure *procedure,
395
428
GValueArray *args;
396
429
GValue value = { 0, };
400
g_return_val_if_fail (GIMP_IS_PROCEDURE (procedure) ||
401
success == FALSE, NULL);
404
n_args = procedure->num_values + 1;
432
g_return_val_if_fail (success == FALSE || GIMP_IS_PROCEDURE (procedure),
437
args = g_value_array_new (procedure->num_values + 1);
439
g_value_init (&value, GIMP_TYPE_PDB_STATUS_TYPE);
440
g_value_set_enum (&value, GIMP_PDB_SUCCESS);
441
g_value_array_append (args, &value);
442
g_value_unset (&value);
444
for (i = 0; i < procedure->num_values; i++)
446
g_value_init (&value, G_PARAM_SPEC_VALUE_TYPE (procedure->values[i]));
447
g_value_array_append (args, &value);
448
g_value_unset (&value);
408
args = g_value_array_new (n_args);
410
g_value_init (&value, GIMP_TYPE_PDB_STATUS_TYPE);
411
g_value_set_enum (&value,
412
success ? GIMP_PDB_SUCCESS : GIMP_PDB_EXECUTION_ERROR);
413
g_value_array_append (args, &value);
414
g_value_unset (&value);
417
for (i = 0; i < procedure->num_values; i++)
419
g_value_init (&value, G_PARAM_SPEC_VALUE_TYPE (procedure->values[i]));
420
g_value_array_append (args, &value);
421
g_value_unset (&value);
453
args = g_value_array_new ((error && error->message) ? 2 : 1);
455
g_value_init (&value, GIMP_TYPE_PDB_STATUS_TYPE);
457
/* errors in the GIMP_PDB_ERROR domain are calling errors */
458
if (error && error->domain == GIMP_PDB_ERROR)
460
switch ((GimpPdbErrorCode) error->code)
462
case GIMP_PDB_PROCEDURE_NOT_FOUND:
463
case GIMP_PDB_INVALID_ARGUMENT:
464
case GIMP_PDB_INVALID_RETURN_VALUE:
465
case GIMP_PDB_INTERNAL_ERROR:
466
g_value_set_enum (&value, GIMP_PDB_CALLING_ERROR);
469
case GIMP_PDB_CANCELLED:
470
g_value_set_enum (&value, GIMP_PDB_CANCEL);
474
g_assert_not_reached ();
479
g_value_set_enum (&value, GIMP_PDB_EXECUTION_ERROR);
482
g_value_array_append (args, &value);
483
g_value_unset (&value);
485
if (error && error->message)
487
g_value_init (&value, G_TYPE_STRING);
488
g_value_set_string (&value, error->message);
489
g_value_array_append (args, &value);
490
g_value_unset (&value);
513
gimp_message (gimp, G_OBJECT (progress),
515
_("Procedure '%s' returned a wrong value type "
516
"for return value '%s' (#%d). "
517
"Expected %s, got %s."),
518
gimp_object_get_name (GIMP_OBJECT (procedure)),
519
g_param_spec_get_name (pspec),
520
i + 1, g_type_name (spec_type),
521
g_type_name (arg_type));
583
GIMP_PDB_ERROR, GIMP_PDB_INVALID_RETURN_VALUE,
584
_("Procedure '%s' returned a wrong value type "
585
"for return value '%s' (#%d). "
586
"Expected %s, got %s."),
587
gimp_object_get_name (GIMP_OBJECT (procedure)),
588
g_param_spec_get_name (pspec),
589
i + 1, g_type_name (spec_type),
590
g_type_name (arg_type));
525
gimp_message (gimp, G_OBJECT (progress),
527
_("Procedure '%s' has been called with a "
528
"wrong value type for argument '%s' (#%d). "
529
"Expected %s, got %s."),
530
gimp_object_get_name (GIMP_OBJECT (procedure)),
531
g_param_spec_get_name (pspec),
532
i + 1, g_type_name (spec_type),
533
g_type_name (arg_type));
595
GIMP_PDB_ERROR, GIMP_PDB_INVALID_ARGUMENT,
596
_("Procedure '%s' has been called with a "
597
"wrong value type for argument '%s' (#%d). "
598
"Expected %s, got %s."),
599
gimp_object_get_name (GIMP_OBJECT (procedure)),
600
g_param_spec_get_name (pspec),
601
i + 1, g_type_name (spec_type),
602
g_type_name (arg_type));
557
gimp_message (gimp, G_OBJECT (progress),
559
_("Procedure '%s' returned an "
560
"invalid ID for argument '%s'. "
561
"Most likely a plug-in is trying "
562
"to work on a layer that doesn't "
563
"exist any longer."),
564
gimp_object_get_name (GIMP_OBJECT (procedure)),
565
g_param_spec_get_name (pspec));
627
GIMP_PDB_ERROR, GIMP_PDB_INVALID_RETURN_VALUE,
628
_("Procedure '%s' returned an "
629
"invalid ID for argument '%s'. "
630
"Most likely a plug-in is trying "
631
"to work on a layer that doesn't "
632
"exist any longer."),
633
gimp_object_get_name (GIMP_OBJECT (procedure)),
634
g_param_spec_get_name (pspec));
569
gimp_message (gimp, G_OBJECT (progress),
571
_("Procedure '%s' has been called with an "
572
"invalid ID for argument '%s'. "
573
"Most likely a plug-in is trying "
574
"to work on a layer that doesn't "
575
"exist any longer."),
576
gimp_object_get_name (GIMP_OBJECT (procedure)),
577
g_param_spec_get_name (pspec));
639
GIMP_PDB_ERROR, GIMP_PDB_INVALID_ARGUMENT,
640
_("Procedure '%s' has been called with an "
641
"invalid ID for argument '%s'. "
642
"Most likely a plug-in is trying "
643
"to work on a layer that doesn't "
644
"exist any longer."),
645
gimp_object_get_name (GIMP_OBJECT (procedure)),
646
g_param_spec_get_name (pspec));
580
649
else if (GIMP_IS_PARAM_SPEC_IMAGE_ID (pspec) &&
585
gimp_message (gimp, G_OBJECT (progress),
587
_("Procedure '%s' returned an "
588
"invalid ID for argument '%s'. "
589
"Most likely a plug-in is trying "
590
"to work on an image that doesn't "
591
"exist any longer."),
592
gimp_object_get_name (GIMP_OBJECT (procedure)),
593
g_param_spec_get_name (pspec));
655
GIMP_PDB_ERROR, GIMP_PDB_INVALID_RETURN_VALUE,
656
_("Procedure '%s' returned an "
657
"invalid ID for argument '%s'. "
658
"Most likely a plug-in is trying "
659
"to work on an image that doesn't "
660
"exist any longer."),
661
gimp_object_get_name (GIMP_OBJECT (procedure)),
662
g_param_spec_get_name (pspec));
597
gimp_message (gimp, G_OBJECT (progress),
599
_("Procedure '%s' has been called with an "
600
"invalid ID for argument '%s'. "
601
"Most likely a plug-in is trying "
602
"to work on an image that doesn't "
603
"exist any longer."),
604
gimp_object_get_name (GIMP_OBJECT (procedure)),
605
g_param_spec_get_name (pspec));
667
GIMP_PDB_ERROR, GIMP_PDB_INVALID_ARGUMENT,
668
_("Procedure '%s' has been called with an "
669
"invalid ID for argument '%s'. "
670
"Most likely a plug-in is trying "
671
"to work on an image that doesn't "
672
"exist any longer."),
673
gimp_object_get_name (GIMP_OBJECT (procedure)),
674
g_param_spec_get_name (pspec));
617
gimp_message (gimp, G_OBJECT (progress),
619
_("Procedure '%s' returned "
620
"'%s' as return value '%s' "
622
"This value is out of range."),
623
gimp_object_get_name (GIMP_OBJECT (procedure)),
625
g_param_spec_get_name (pspec),
626
i + 1, g_type_name (spec_type));
687
GIMP_PDB_ERROR, GIMP_PDB_INVALID_RETURN_VALUE,
688
_("Procedure '%s' returned "
689
"'%s' as return value '%s' "
691
"This value is out of range."),
692
gimp_object_get_name (GIMP_OBJECT (procedure)),
694
g_param_spec_get_name (pspec),
695
i + 1, g_type_name (spec_type));
630
gimp_message (gimp, G_OBJECT (progress),
632
_("Procedure '%s' has been called with "
633
"value '%s' for argument '%s' "
635
"This value is out of range."),
636
gimp_object_get_name (GIMP_OBJECT (procedure)),
638
g_param_spec_get_name (pspec),
639
i + 1, g_type_name (spec_type));
700
GIMP_PDB_ERROR, GIMP_PDB_INVALID_ARGUMENT,
701
_("Procedure '%s' has been called with "
702
"value '%s' for argument '%s' "
704
"This value is out of range."),
705
gimp_object_get_name (GIMP_OBJECT (procedure)),
707
g_param_spec_get_name (pspec),
708
i + 1, g_type_name (spec_type));