summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorTomas Bzatek <tbzatek@users.sourceforge.net>2015-01-25 20:50:42 +0100
committerTomas Bzatek <tbzatek@users.sourceforge.net>2015-01-25 20:50:42 +0100
commit7387a70b2f460d8a5e43de71cbe6a315430dc469 (patch)
tree153c64bd03f869a7f54938f6d1b21f3774fb8c76 /src
parent5a9e74611d2faef1fb68873b1e7925a5850ec86f (diff)
downloadcataract-7387a70b2f460d8a5e43de71cbe6a315430dc469.tar.xz
block-parser: Enhance block_parser_register_function() with a destroy notify callback
Diffstat (limited to 'src')
-rw-r--r--src/block-parser.c20
-rw-r--r--src/block-parser.h2
-rw-r--r--src/generators.c19
3 files changed, 25 insertions, 16 deletions
diff --git a/src/block-parser.c b/src/block-parser.c
index 5c806cf..eb505ed 100644
--- a/src/block-parser.c
+++ b/src/block-parser.c
@@ -53,6 +53,7 @@ typedef struct {
typedef struct {
BlockParserConditionalFunction callback;
gpointer user_data;
+ GDestroyNotify data_destroy_func;
} BlockParserFuncData;
@@ -70,6 +71,20 @@ block_parser_destroy_notify (gpointer data)
g_free (d);
}
+static void
+block_parser_func_data_destroy_notify (gpointer data)
+{
+ BlockParserFuncData *d = data;
+
+ if (data == NULL)
+ return;
+
+ if (d->data_destroy_func != NULL)
+ d->data_destroy_func (d->user_data);
+ g_free (d);
+}
+
+
BlockParser *
block_parser_new ()
{
@@ -77,7 +92,7 @@ block_parser_new ()
parser = g_new0 (BlockParser, 1);
parser->table = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, block_parser_destroy_notify);
- parser->functions = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free);
+ parser->functions = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, block_parser_func_data_destroy_notify);
parser->active_tree = g_queue_new ();
return parser;
@@ -133,7 +148,7 @@ block_parser_register_key (BlockParser *parser, const gchar *key, const gchar *r
*
*/
void
-block_parser_register_function (BlockParser *parser, const gchar *conditional_name, BlockParserConditionalFunction callback, gpointer user_data)
+block_parser_register_function (BlockParser *parser, const gchar *conditional_name, BlockParserConditionalFunction callback, gpointer user_data, GDestroyNotify data_destroy_func)
{
BlockParserFuncData *func_data;
@@ -142,6 +157,7 @@ block_parser_register_function (BlockParser *parser, const gchar *conditional_na
func_data = g_malloc0 (sizeof (BlockParserFuncData));
func_data->callback = callback;
func_data->user_data = user_data;
+ func_data->data_destroy_func = data_destroy_func;
g_hash_table_insert (parser->functions, g_strdup (conditional_name), func_data);
}
diff --git a/src/block-parser.h b/src/block-parser.h
index f66aa08..5d8b69c 100644
--- a/src/block-parser.h
+++ b/src/block-parser.h
@@ -55,7 +55,7 @@ void block_parser_register_key (BlockParser *parser, const gchar *key, const gch
* block_parser_register_function: function called to determine whether a block should be ignored or not
*
*/
-void block_parser_register_function (BlockParser *parser, const gchar *conditional_name, BlockParserConditionalFunction callback, gpointer user_data);
+void block_parser_register_function (BlockParser *parser, const gchar *conditional_name, BlockParserConditionalFunction callback, gpointer user_data, GDestroyNotify data_destroy_func);
/*
* block_parser_get_data: return retrieved data or NULL if none read yet
diff --git a/src/generators.c b/src/generators.c
index c1cb2e4..ae3219d 100644
--- a/src/generators.c
+++ b/src/generators.c
@@ -749,7 +749,6 @@ process_img_item (TGallerySetup *setup,
GHashTable *defines,
TImageSize *image_size,
TImageSize *thumb_image_size,
- ExifData *exif,
gboolean list_mode)
{
unsigned long img_w, img_h;
@@ -764,6 +763,7 @@ process_img_item (TGallerySetup *setup,
gchar *img_orig_dst_page;
gchar *title, *title_desc;
TImageSize *orig_image_size;
+ ExifData *exif = NULL;
if (list_mode) {
/* Index stuff */
@@ -833,6 +833,8 @@ process_img_item (TGallerySetup *setup,
replace_table_add_key_int (replace_table, "IMG_SIZE_H", img_h);
replace_table_add_key (replace_table, "IMG_SRC", img_dst_page);
+ exif = get_img_exif_data (setup, path_info, items, item, image_size);
+
/* TODO: legacy stuff, subject to removal */
orig_image_size = lookup_image_size_for_name (setup, "original");
if (orig_image_size == NULL)
@@ -875,7 +877,7 @@ process_img_item (TGallerySetup *setup,
/* EXIF callbacks - all do handle NULL value pointer */
replace_table_register_function (replace_table, "get_exif_value", get_exif_value_cb, exif);
replace_table_register_function (replace_table, "get_exif_value_fixed", get_exif_value_fixed_cb, exif);
- block_parser_register_function (block_parser, "have_exif_key", have_exif_key_cb, exif);
+ block_parser_register_function (block_parser, "have_exif_key", have_exif_key_cb, exif, (GDestroyNotify) exif_data_free);
if (exif != NULL && exif_has_key (exif, EXIF_APERTURE) &&
exif_has_key (exif, EXIF_FOCAL_LENGTH) &&
exif_has_key (exif, EXIF_EXPOSURE))
@@ -929,10 +931,8 @@ write_html_page (TGallerySetup *setup,
GHashTable *defines;
GHashTable *local_defines;
TImageSize *image_size, *thumb_image_size;
- ExifData *exif, *local_exif;
res = TRUE;
- exif = NULL;
fin = fopen (template_src, "r");
if (fin == NULL) {
@@ -1006,9 +1006,7 @@ write_html_page (TGallerySetup *setup,
/* Picture page tags */
if (item != NULL) {
add_next_prev_links (setup, path_info, theme, items, item, global_replace_table, image_size);
- if (image_size != NULL)
- exif = get_img_exif_data (setup, path_info, items, item, image_size);
- process_img_item (setup, path_info, theme, items, item, block_parser, global_replace_table, defines, image_size, thumb_image_size, exif, FALSE);
+ process_img_item (setup, path_info, theme, items, item, block_parser, global_replace_table, defines, image_size, thumb_image_size, FALSE);
}
/* Setup block parser */
@@ -1043,15 +1041,12 @@ write_html_page (TGallerySetup *setup,
local_replace_table = replace_table_new ();
local_defines = clone_string_hash_table (defines);
s1 = NULL;
- local_exif = NULL;
switch (iter_item->type) {
case INDEX_ITEM_TYPE_PICTURE:
if (! iter_item->hidden) {
s1 = block_parser_get_data (block_parser, "LIST_PICTURE");
- if (image_size != NULL)
- local_exif = get_img_exif_data (setup, path_info, items, iter_item, image_size);
- process_img_item (setup, path_info, theme, items, iter_item, local_block_parser, local_replace_table, local_defines, image_size, thumb_image_size, local_exif, TRUE);
+ process_img_item (setup, path_info, theme, items, iter_item, local_block_parser, local_replace_table, local_defines, image_size, thumb_image_size, TRUE);
}
break;
@@ -1072,7 +1067,6 @@ write_html_page (TGallerySetup *setup,
g_free (s2);
g_free (s1);
}
- exif_data_free (local_exif);
block_parser_free (local_block_parser);
replace_table_free (local_replace_table);
g_hash_table_destroy (local_defines);
@@ -1112,7 +1106,6 @@ write_html_page (TGallerySetup *setup,
fclose (fout);
fclose (fin);
g_free (buffer);
- exif_data_free (exif);
g_hash_table_destroy (defines);
replace_table_free (global_replace_table);
block_parser_free (block_parser);