From 7387a70b2f460d8a5e43de71cbe6a315430dc469 Mon Sep 17 00:00:00 2001 From: Tomas Bzatek Date: Sun, 25 Jan 2015 20:50:42 +0100 Subject: block-parser: Enhance block_parser_register_function() with a destroy notify callback --- src/block-parser.c | 20 ++++++++++++++++++-- src/block-parser.h | 2 +- src/generators.c | 19 ++++++------------- 3 files changed, 25 insertions(+), 16 deletions(-) (limited to 'src') 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); -- cgit v1.2.3