app: add a small infrastructure to validate known parasites

when they are added to items, images or globally, from the PDF or an
XCF file. None of the validation functions does anything currently,
they simply return TRUE.
This commit is contained in:
Michael Natterer 2014-03-22 00:11:15 +01:00
parent 245106f320
commit 60f23afde2
13 changed files with 129 additions and 13 deletions

View File

@ -28,6 +28,18 @@
#include "gimpparasitelist.h" #include "gimpparasitelist.h"
gboolean
gimp_parasite_validate (Gimp *gimp,
const GimpParasite *parasite,
GError **error)
{
g_return_val_if_fail (GIMP_IS_GIMP (gimp), FALSE);
g_return_val_if_fail (parasite != NULL, FALSE);
g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
return TRUE;
}
void void
gimp_parasite_attach (Gimp *gimp, gimp_parasite_attach (Gimp *gimp,
const GimpParasite *parasite) const GimpParasite *parasite)

View File

@ -20,6 +20,9 @@
/* some wrappers to access gimp->parasites, mainly for the PDB */ /* some wrappers to access gimp->parasites, mainly for the PDB */
gboolean gimp_parasite_validate (Gimp *gimp,
const GimpParasite *parasite,
GError **error);
void gimp_parasite_attach (Gimp *gimp, void gimp_parasite_attach (Gimp *gimp,
const GimpParasite *parasite); const GimpParasite *parasite);
void gimp_parasite_detach (Gimp *gimp, void gimp_parasite_detach (Gimp *gimp,

View File

@ -3050,6 +3050,18 @@ gimp_image_parasite_list (const GimpImage *image,
return list; return list;
} }
gboolean
gimp_image_parasite_validate (GimpImage *image,
const GimpParasite *parasite,
GError **error)
{
g_return_val_if_fail (GIMP_IS_IMAGE (image), FALSE);
g_return_val_if_fail (parasite != NULL, FALSE);
g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
return TRUE;
}
void void
gimp_image_parasite_attach (GimpImage *image, gimp_image_parasite_attach (GimpImage *image,
const GimpParasite *parasite) const GimpParasite *parasite)

View File

@ -286,6 +286,9 @@ const GimpParasite * gimp_image_parasite_find (const GimpImage *image,
const gchar *name); const gchar *name);
gchar ** gimp_image_parasite_list (const GimpImage *image, gchar ** gimp_image_parasite_list (const GimpImage *image,
gint *count); gint *count);
gboolean gimp_image_parasite_validate (GimpImage *image,
const GimpParasite *parasite,
GError **error);
void gimp_image_parasite_attach (GimpImage *image, void gimp_image_parasite_attach (GimpImage *image,
const GimpParasite *parasite); const GimpParasite *parasite);
void gimp_image_parasite_detach (GimpImage *image, void gimp_image_parasite_detach (GimpImage *image,

View File

@ -1798,6 +1798,18 @@ gimp_item_get_parasites (const GimpItem *item)
return GET_PRIVATE (item)->parasites; return GET_PRIVATE (item)->parasites;
} }
gboolean
gimp_item_parasite_validate (GimpItem *item,
const GimpParasite *parasite,
GError **error)
{
g_return_val_if_fail (GIMP_IS_ITEM (item), FALSE);
g_return_val_if_fail (parasite != NULL, FALSE);
g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
return TRUE;
}
void void
gimp_item_parasite_attach (GimpItem *item, gimp_item_parasite_attach (GimpItem *item,
const GimpParasite *parasite, const GimpParasite *parasite,

View File

@ -274,6 +274,9 @@ void gimp_item_set_parasites (GimpItem *item,
GimpParasiteList *parasites); GimpParasiteList *parasites);
GimpParasiteList * gimp_item_get_parasites (const GimpItem *item); GimpParasiteList * gimp_item_get_parasites (const GimpItem *item);
gboolean gimp_item_parasite_validate (GimpItem *item,
const GimpParasite *parasite,
GError **error);
void gimp_item_parasite_attach (GimpItem *item, void gimp_item_parasite_attach (GimpItem *item,
const GimpParasite *parasite, const GimpParasite *parasite,
gboolean push_undo); gboolean push_undo);

View File

@ -114,7 +114,10 @@ attach_parasite_invoker (GimpProcedure *procedure,
if (success) if (success)
{ {
gimp_parasite_attach (gimp, parasite); if (gimp_parasite_validate (gimp, parasite, error))
gimp_parasite_attach (gimp, parasite);
else
success = FALSE;
} }
return gimp_procedure_get_return_values (procedure, success, return gimp_procedure_get_return_values (procedure, success,

View File

@ -2833,7 +2833,10 @@ image_attach_parasite_invoker (GimpProcedure *procedure,
if (success) if (success)
{ {
gimp_image_parasite_attach (image, parasite); if (gimp_image_parasite_validate (image, parasite, error))
gimp_image_parasite_attach (image, parasite);
else
success = FALSE;
} }
return gimp_procedure_get_return_values (procedure, success, return gimp_procedure_get_return_values (procedure, success,

View File

@ -785,7 +785,10 @@ item_attach_parasite_invoker (GimpProcedure *procedure,
if (success) if (success)
{ {
gimp_item_parasite_attach (item, parasite, TRUE); if (gimp_item_parasite_validate (item, parasite, error))
gimp_item_parasite_attach (item, parasite, TRUE);
else
success = FALSE;
} }
return gimp_procedure_get_return_values (procedure, success, return gimp_procedure_get_return_values (procedure, success,

View File

@ -753,12 +753,25 @@ xcf_load_image_props (XcfInfo *info,
while (info->cp - base < prop_size) while (info->cp - base < prop_size)
{ {
GimpParasite *p = xcf_load_parasite (info); GimpParasite *p = xcf_load_parasite (info);
GError *error = NULL;
if (! p) if (! p)
return FALSE; return FALSE;
gimp_image_parasite_attach (image, p); if (! gimp_image_parasite_validate (image, p, &error))
{
gimp_message (info->gimp, G_OBJECT (info->progress),
GIMP_MESSAGE_WARNING,
"Warning, invalid image parasite in XCF file: %s",
error->message);
g_clear_error (&error);
}
else
{
gimp_image_parasite_attach (image, p);
}
gimp_parasite_free (p); gimp_parasite_free (p);
} }
@ -1026,12 +1039,25 @@ xcf_load_layer_props (XcfInfo *info,
while (info->cp - base < prop_size) while (info->cp - base < prop_size)
{ {
GimpParasite *p = xcf_load_parasite (info); GimpParasite *p = xcf_load_parasite (info);
GError *error = NULL;
if (! p) if (! p)
return FALSE; return FALSE;
gimp_item_parasite_attach (GIMP_ITEM (*layer), p, FALSE); if (! gimp_item_parasite_validate (GIMP_ITEM (*layer), p, &error))
{
gimp_message (info->gimp, G_OBJECT (info->progress),
GIMP_MESSAGE_WARNING,
"Warning, invalid layer parasite in XCF file: %s",
error->message);
g_clear_error (&error);
}
else
{
gimp_item_parasite_attach (GIMP_ITEM (*layer), p, FALSE);
}
gimp_parasite_free (p); gimp_parasite_free (p);
} }
@ -1222,12 +1248,26 @@ xcf_load_channel_props (XcfInfo *info,
while ((info->cp - base) < prop_size) while ((info->cp - base) < prop_size)
{ {
GimpParasite *p = xcf_load_parasite (info); GimpParasite *p = xcf_load_parasite (info);
GError *error = NULL;
if (! p) if (! p)
return FALSE; return FALSE;
gimp_item_parasite_attach (GIMP_ITEM (*channel), p, FALSE); if (! gimp_item_parasite_validate (GIMP_ITEM (*channel), p,
&error))
{
gimp_message (info->gimp, G_OBJECT (info->progress),
GIMP_MESSAGE_WARNING,
"Warning, invalid channel parasite in XCF file: %s",
error->message);
g_clear_error (&error);
}
else
{
gimp_item_parasite_attach (GIMP_ITEM (*channel), p, FALSE);
}
gimp_parasite_free (p); gimp_parasite_free (p);
} }
@ -2148,11 +2188,24 @@ xcf_load_vector (XcfInfo *info,
for (i = 0; i < num_parasites; i++) for (i = 0; i < num_parasites; i++)
{ {
GimpParasite *parasite = xcf_load_parasite (info); GimpParasite *parasite = xcf_load_parasite (info);
GError *error = NULL;
if (! parasite) if (! parasite)
return FALSE; return FALSE;
gimp_item_parasite_attach (GIMP_ITEM (vectors), parasite, FALSE); if (! gimp_item_parasite_validate (GIMP_ITEM (vectors), parasite, &error))
{
gimp_message (info->gimp, G_OBJECT (info->progress),
GIMP_MESSAGE_WARNING,
"Warning, invalid vectors parasite in XCF file: %s",
error->message);
g_clear_error (&error);
}
else
{
gimp_item_parasite_attach (GIMP_ITEM (vectors), parasite, FALSE);
}
gimp_parasite_free (parasite); gimp_parasite_free (parasite);
} }

View File

@ -106,7 +106,10 @@ HELP
%invoke = ( %invoke = (
code => <<'CODE' code => <<'CODE'
{ {
gimp_parasite_attach (gimp, parasite); if (gimp_parasite_validate (gimp, parasite, error))
gimp_parasite_attach (gimp, parasite);
else
success = FALSE;
} }
CODE CODE
); );

View File

@ -2862,7 +2862,10 @@ HELP
%invoke = ( %invoke = (
code => <<'CODE' code => <<'CODE'
{ {
gimp_image_parasite_attach (image, parasite); if (gimp_image_parasite_validate (image, parasite, error))
gimp_image_parasite_attach (image, parasite);
else
success = FALSE;
} }
CODE CODE
); );

View File

@ -753,7 +753,10 @@ HELP
%invoke = ( %invoke = (
code => <<'CODE' code => <<'CODE'
{ {
gimp_item_parasite_attach (item, parasite, TRUE); if (gimp_item_parasite_validate (item, parasite, error))
gimp_item_parasite_attach (item, parasite, TRUE);
else
success = FALSE;
} }
CODE CODE
); );