diff options
Diffstat (limited to 'src/setup.c')
| -rw-r--r-- | src/setup.c | 348 |
1 files changed, 259 insertions, 89 deletions
diff --git a/src/setup.c b/src/setup.c index 68c3cd3..f09a908 100644 --- a/src/setup.c +++ b/src/setup.c @@ -21,11 +21,6 @@ #include <errno.h> #include <unistd.h> -#include <libxml/xmlmemory.h> -#include <libxml/parser.h> -#include <libxml/xpath.h> -#include <libxml/xpathInternals.h> - #include <glib.h> #include <glib/gstdio.h> @@ -91,122 +86,264 @@ parse_setup_xml (const gchar *filename) setup = g_malloc0 (sizeof (TGallerySetup)); setup->setup_xml_path = g_strdup (filename); - setup->templates_path = xml_file_get_node_value (xml, "/gallery_setup/templates/path/text()"); - setup->template_index = xml_file_get_node_value (xml, "/gallery_setup/templates/index/text()"); - setup->template_album = xml_file_get_node_value (xml, "/gallery_setup/templates/album/text()"); - setup->template_photo = xml_file_get_node_value (xml, "/gallery_setup/templates/photo/text()"); - s = xml_file_get_node_value (xml, "/gallery_setup/templates/template_files/text()"); - if (s) { - setup->template_files = g_strsplit (s, "\n", -1); - g_free (s); - } - setup->support_files_use_common_root = xml_file_get_node_attribute_boolean (xml, "/gallery_setup/templates/support_files_use_common_root", "value", FALSE); - setup->index_file_name = xml_file_get_node_value_with_default (xml, "/gallery_setup/templates/index_file/text()", DEFAULT_INDEX_FILENAME); - - setup->thumbnail_dir = xml_file_get_node_value_with_default (xml, "/gallery_setup/images/thumbnail_dir/text()", DEFAULT_THUMBNAIL_DIR); - setup->img_big_dir = xml_file_get_node_value_with_default (xml, "/gallery_setup/images/preview_dir/text()", DEFAULT_IMG_BIG_DIR); - setup->img_orig_dir = xml_file_get_node_value_with_default (xml, "/gallery_setup/images/original_dir/text()", DEFAULT_IMG_ORIG_DIR); - setup->thumbnail_name_format = xml_file_get_node_value_with_default (xml, "/gallery_setup/images/thumbnail_name_format/text()", DEFAULT_THUMBNAIL_NAME_FORMAT); - if (strstr (setup->thumbnail_name_format, "%s") == NULL) { - g_free (setup->thumbnail_name_format); - setup->thumbnail_name_format = g_strdup (DEFAULT_THUMBNAIL_NAME_FORMAT); - } + /* design section */ + setup->design_setup_file = xml_file_get_node_value (xml, "/gallery_setup/design/setup_file/text()"); + setup->supplemental_files_use_common_root = xml_file_get_node_attribute_boolean (xml, "/gallery_setup/design/supplemental_files_use_common_root", "value", FALSE); - setup->thumbnail_landscape_width = xml_file_get_node_attribute_long (xml, "/gallery_setup/images/thumbnail", "landscape_w", 0); - setup->thumbnail_landscape_height = xml_file_get_node_attribute_long (xml, "/gallery_setup/images/thumbnail", "landscape_h", 0); - setup->thumbnail_portrait_width = xml_file_get_node_attribute_long (xml, "/gallery_setup/images/thumbnail", "portrait_w", 0); - setup->thumbnail_portrait_height = xml_file_get_node_attribute_long (xml, "/gallery_setup/images/thumbnail", "portrait_h", 0); - setup->thumbnail_square_size = xml_file_get_node_attribute_long (xml, "/gallery_setup/images/thumbnail", "square", 0); - setup->thumbnail_quality = xml_file_get_node_attribute_long (xml, "/gallery_setup/images/thumbnail", "quality", -1); - setup->preview_landscape_width = xml_file_get_node_attribute_long (xml, "/gallery_setup/images/preview", "landscape_w", 0); - setup->preview_landscape_height = xml_file_get_node_attribute_long (xml, "/gallery_setup/images/preview", "landscape_h", 0); - setup->preview_portrait_width = xml_file_get_node_attribute_long (xml, "/gallery_setup/images/preview", "portrait_w", 0); - setup->preview_portrait_height = xml_file_get_node_attribute_long (xml, "/gallery_setup/images/preview", "portrait_h", 0); - setup->preview_quality = xml_file_get_node_attribute_long (xml, "/gallery_setup/images/preview", "quality", -1); - setup->footer = xml_file_get_node_value (xml, "/gallery_setup/footer/text()"); + /* images section */ setup->border_style = xml_file_get_node_attribute (xml, "/gallery_setup/images/border", "style"); + setup->preload = xml_file_get_node_attribute_boolean (xml, "/gallery_setup/images/preload", "value", TRUE); + setup->use_iptc_exif = xml_file_get_node_attribute_boolean (xml, "/gallery_setup/images/use_iptc_exif", "value", FALSE); + setup->erase_exif_thumbnail = xml_file_get_node_attribute_boolean (xml, "/gallery_setup/images/erase_embed_thumbnail", "value", FALSE); + setup->nofullsize = xml_file_get_node_present (xml, "/gallery_setup/images/nofullsize"); + + s = xml_file_get_node_attribute (xml, "/gallery_setup/images/squared_thumbnails", "type"); + if (s && g_ascii_strcasecmp (s, "simple") == 0) + setup->squared_thumbnail_type = THUMBNAIL_SQUARE_TYPE_SIMPLE; + else + setup->squared_thumbnail_type = THUMBNAIL_SQUARE_TYPE_NONE; + g_free (s); + + /* meta section */ setup->meta_author = xml_file_get_node_value (xml, "/gallery_setup/meta/author/text()"); setup->meta_author_email = xml_file_get_node_value (xml, "/gallery_setup/meta/author_email/text()"); setup->meta_description = xml_file_get_node_value (xml, "/gallery_setup/meta/description/text()"); setup->meta_keywords = xml_file_get_node_value (xml, "/gallery_setup/meta/keywords/text()"); - - setup->preload = xml_file_get_node_attribute_boolean (xml, "/gallery_setup/images/preload", "value", TRUE); - setup->use_iptc_exif = xml_file_get_node_attribute_boolean (xml, "/gallery_setup/images/use_iptc_exif", "value", FALSE); - setup->erase_exif_thumbnail = xml_file_get_node_attribute_boolean (xml, "/gallery_setup/images/erase_embed_thumbnail", "value", FALSE); setup->use_title_as_meta = xml_file_get_node_attribute_boolean (xml, "/gallery_setup/meta/use_title_as_meta", "value", TRUE); - setup->site_title = xml_file_get_node_attribute (xml, "/gallery_setup/meta/site", "title"); setup->add_copyright = xml_file_get_node_value (xml, "/gallery_setup/meta/add_copyright/text()"); + setup->favicon_file = xml_file_get_node_value (xml, "/gallery_setup/meta/favicon/text()"); + setup->favicon_type = xml_file_get_node_attribute (xml, "/gallery_setup/meta/favicon", "type"); + + /* navigation section */ setup->use_inpage_links = xml_file_get_node_attribute_boolean (xml, "/gallery_setup/navigation/use_inpage_links", "value", TRUE); setup->show_go_up = xml_file_get_node_attribute_boolean (xml, "/gallery_setup/navigation/show_go_up", "value", TRUE); setup->show_exif_table = xml_file_get_node_attribute_boolean (xml, "/gallery_setup/navigation/show_exif_table", "value", TRUE); - setup->nofullsize = xml_file_get_node_present (xml, "/gallery_setup/images/nofullsize"); - - setup->favicon_file = xml_file_get_node_value (xml, "/gallery_setup/meta/favicon/text()"); - setup->favicon_type = xml_file_get_node_attribute (xml, "/gallery_setup/meta/favicon", "type"); - + /* feed section */ setup->feed_enabled = xml_file_get_node_attribute_boolean (xml, "/gallery_setup/feed", "enable", FALSE); setup->feed_filename = xml_file_get_node_value (xml, "/gallery_setup/feed/filename/text()"); setup->feed_title = xml_file_get_node_value (xml, "/gallery_setup/feed/title/text()"); setup->feed_base_url = xml_file_get_node_value (xml, "/gallery_setup/feed/base_url/text()"); - s = xml_file_get_node_attribute (xml, "/gallery_setup/images/squared_thumbnails", "type"); - if (s && g_ascii_strcasecmp (s, "simple") == 0) - setup->squared_thumbnail_type = THUMBNAIL_SQUARE_TYPE_SIMPLE; - else - setup->squared_thumbnail_type = THUMBNAIL_SQUARE_TYPE_NONE; - g_free (s); + /* footer section */ + setup->footer = xml_file_get_node_value (xml, "/gallery_setup/footer/text()"); xml_parser_free (xml); return setup; } - -static int -test_tmpl_access (const gchar *dir, const gchar *path) +/* + * parse_design_setup_xml: XML parser for design.xml file + */ +TGalleryDesign * +parse_design_setup_xml (const gchar *filename) { + TXMLFile *xml; gchar *s; - int b; + gchar *s2; + TGalleryDesign *design; + TImageSize *image_size; + TGalleryDesignTheme *theme; + int count; + int i; - s = g_build_filename (dir, path, NULL); - b = g_access (s, R_OK); - g_free (s); - return b; + xml = xml_parser_load (filename); + if (xml == NULL) + return NULL; + + design = g_malloc0 (sizeof (TGalleryDesign)); + + s2 = xml_file_get_node_value (xml, "/design_setup/supplemental_files/text()"); + if (s2) { + design->supplemental_files = g_strsplit (s2, "\n", -1); + g_free (s2); + } + + + /* image_sizes section */ + count = xml_file_node_get_children_count (xml, "/design_setup/image_sizes/size"); + for (i = 0; i < count; i++) { + image_size = g_malloc0 (sizeof (TImageSize)); + design->image_sizes = g_list_append (design->image_sizes, image_size); + + s = g_strdup_printf ("/design_setup/image_sizes/size[%d]", i + 1); + image_size->name = xml_file_get_node_attribute (xml, s, "name"); + g_free (s); + + s = g_strdup_printf ("/design_setup/image_sizes/size[%d]/landscape", i + 1); + image_size->landscape_width = xml_file_get_node_attribute_long (xml, s, "w", 0); + image_size->landscape_height = xml_file_get_node_attribute_long (xml, s, "h", 0); + g_free (s); + + s = g_strdup_printf ("/design_setup/image_sizes/size[%d]/portrait", i + 1); + image_size->portrait_width = xml_file_get_node_attribute_long (xml, s, "w", 0); + image_size->portrait_height = xml_file_get_node_attribute_long (xml, s, "h", 0); + g_free (s); + + s = g_strdup_printf ("/design_setup/image_sizes/size[%d]/square", i + 1); + image_size->square_size = xml_file_get_node_attribute_long (xml, s, "size", 0); + g_free (s); + + s = g_strdup_printf ("/design_setup/image_sizes/size[%d]/quality", i + 1); + image_size->quality = xml_file_get_node_attribute_long (xml, s, "value", -1); + g_free (s); + + s = g_strdup_printf ("/design_setup/image_sizes/size[%d]/no_resize", i + 1); + image_size->no_resize = xml_file_get_node_present (xml, s); + g_free (s); + } + + + /* theme section */ + count = xml_file_node_get_children_count (xml, "/design_setup/theme"); + for (i = 0; i < count; i++) { + theme = g_malloc0 (sizeof (TGalleryDesignTheme)); + design->themes = g_list_append (design->themes, theme); + + s = g_strdup_printf ("/design_setup/theme[%d]", i + 1); + theme->enabled = xml_file_get_node_attribute_boolean (xml, s, "enabled", TRUE); + g_free (s); + + s = g_strdup_printf ("/design_setup/theme[%d]/index/template/text()", i + 1); + theme->index_template = xml_file_get_node_value (xml, s); + g_free (s); + s = g_strdup_printf ("/design_setup/theme[%d]/index/target_filename/text()", i + 1); + theme->index_filename = xml_file_get_node_value_with_default (xml, s, DEFAULT_INDEX_FILENAME); + g_free (s); + + s = g_strdup_printf ("/design_setup/theme[%d]/album/template/text()", i + 1); + theme->album_template = xml_file_get_node_value (xml, s); + g_free (s); + s = g_strdup_printf ("/design_setup/theme[%d]/album/target_filename/text()", i + 1); + theme->album_filename = xml_file_get_node_value_with_default (xml, s, DEFAULT_INDEX_FILENAME); + g_free (s); + s = g_strdup_printf ("/design_setup/theme[%d]/album/picture_size/text()", i + 1); + theme->album_image_size = xml_file_get_node_value (xml, s); + g_free (s); + + s = g_strdup_printf ("/design_setup/theme[%d]/picture/template/text()", i + 1); + theme->picture_template = xml_file_get_node_value (xml, s); + g_free (s); + s = g_strdup_printf ("/design_setup/theme[%d]/picture/target_filename/text()", i + 1); + theme->picture_filename = xml_file_get_node_value (xml, s); + g_free (s); + s = g_strdup_printf ("/design_setup/theme[%d]/picture/picture_size/text()", i + 1); + theme->picture_image_size = xml_file_get_node_value (xml, s); + g_free (s); + + s = g_strdup_printf ("/design_setup/theme[%d]/supplemental_files/text()", i + 1); + s2 = xml_file_get_node_value (xml, s); + if (s2) { + theme->supplemental_files = g_strsplit (s2, "\n", -1); + g_free (s2); + } + g_free (s); + } + + xml_parser_free (xml); + return design; } -static int -test_tmpl_files (const gchar *dir, TGallerySetup *setup) + +static gboolean +lookup_image_size (TGalleryDesign *design, const gchar *image_size_name) +{ + GList *l; + TImageSize *image_size; + + g_return_val_if_fail (image_size_name != NULL, FALSE); + g_return_val_if_fail (strlen (image_size_name) > 0, FALSE); + + for (l = g_list_first (design->image_sizes); l; l = g_list_next (l)) { + image_size = l->data; + g_assert (image_size != NULL); + if (image_size->name == NULL || strlen (image_size->name) == 0) { + fprintf (stderr, "design validation warning: image size %p defined with no name\n", image_size); + continue; + } + if (image_size->landscape_width <= 0 || image_size->landscape_height <= 0 || + image_size->portrait_width <= 0 || image_size->portrait_height <= 0) { + fprintf (stderr, "design validation warning: image size %s defined with zero sized element\n", image_size->name); + continue; + } + if (g_ascii_strcasecmp (image_size_name, image_size->name) == 0) + return TRUE; + } + + return FALSE; +} + +/* + * validate_design_setup: validate design.xml file setup + */ +gboolean +validate_design_setup (TGalleryDesign *design) { - return test_tmpl_access (dir, setup->template_album) | - test_tmpl_access (dir, setup->template_photo) | - test_tmpl_access (dir, setup->template_index); + GList *l; + TGalleryDesignTheme *theme; + + /* validate sizes */ + if (g_list_length (design->image_sizes) == 0) { + fprintf (stderr, "design validation error: no image size defined\n"); + return FALSE; + } + + /* validate themes */ + if (g_list_length (design->themes) == 0) { + fprintf (stderr, "design validation error: no theme defined\n"); + return FALSE; + } + for (l = g_list_first (design->themes); l; l = g_list_next (l)) { + theme = l->data; + g_assert (theme != NULL); + if (theme->album_image_size && ! lookup_image_size (design, theme->album_image_size)) { + fprintf (stderr, "design validation error: theme-defined image size '%s' not found\n", theme->album_image_size); + return FALSE; + } + if (theme->picture_image_size == NULL || strlen (theme->picture_image_size) == 0) { + fprintf (stderr, "design validation error: theme does not define mandatory picture size argument\n"); + return FALSE; + } + if (! lookup_image_size (design, theme->picture_image_size)) { + fprintf (stderr, "design validation error: theme-defined image size '%s' not found\n", theme->picture_image_size); + return FALSE; + } + } + + return TRUE; } + /* - * find_templates_directory: absolute/relative path checks, trying to find templates directory - * - returned string should be freed + * find_design_directory: try to find design templates directory + * - returned string should be freed */ gchar * -find_templates_directory (TGallerySetup *setup) +find_design_directory (TGallerySetup *setup) { gchar *base_dir; - gchar *pth; + gchar *base_design_dir; + gchar *pth = NULL; - if (IS_DIR_SEP (*setup->templates_path)) { - if (! test_tmpl_files (setup->templates_path, setup)) - return g_strdup (setup->templates_path); + if (IS_DIR_SEP (*setup->design_setup_file)) { + pth = g_path_get_dirname (setup->design_setup_file); + if (g_access (pth, R_OK)) + return pth; } else { base_dir = g_path_get_dirname (setup->setup_xml_path); - pth = g_build_path (G_DIR_SEPARATOR_S, base_dir, setup->templates_path, NULL); + base_design_dir = g_path_get_dirname (setup->design_setup_file); + pth = g_build_path (G_DIR_SEPARATOR_S, base_dir, base_design_dir, NULL); g_free (base_dir); + g_free (base_design_dir); - if (! test_tmpl_files (pth, setup)) + if (g_access (pth, R_OK) == 0) return pth; } - log_error ("Couldn't find proper templates directory (tried '%s')\n", setup->templates_path); + log_error ("Couldn't find proper design templates directory (tried '%s')\n", pth); + g_free (pth); return NULL; } @@ -218,31 +355,64 @@ void free_setup_data (TGallerySetup *setup) { if (setup) { - g_free (setup->real_templates_dir); g_free (setup->setup_xml_path); - g_free (setup->templates_path); - g_free (setup->template_index); - g_free (setup->template_album); - g_free (setup->template_photo); - g_strfreev (setup->template_files); - g_free (setup->index_file_name); - g_free (setup->footer); + g_free (setup->design_setup_file); + g_free (setup->border_style); g_free (setup->meta_author); g_free (setup->meta_author_email); g_free (setup->meta_description); g_free (setup->meta_keywords); - g_free (setup->border_style); g_free (setup->site_title); g_free (setup->add_copyright); g_free (setup->favicon_file); g_free (setup->favicon_type); - g_free (setup->thumbnail_dir); - g_free (setup->img_big_dir); - g_free (setup->img_orig_dir); - g_free (setup->thumbnail_name_format); g_free (setup->feed_filename); g_free (setup->feed_title); g_free (setup->feed_base_url); + g_free (setup->footer); + free_design_setup_data (setup->design); g_free (setup); } } + +static void +free_image_size_data (TImageSize *image_size) +{ + if (image_size) { + g_free (image_size->name); + g_free (image_size); + } +} + +static void +free_design_theme_data (TGalleryDesignTheme *theme) +{ + if (theme) { + g_free (theme->index_template); + g_free (theme->index_filename); + g_free (theme->album_template); + g_free (theme->album_filename); + g_free (theme->album_image_size); + g_free (theme->picture_template); + g_free (theme->picture_filename); + g_free (theme->picture_image_size); + g_strfreev (theme->supplemental_files); + g_free (theme); + } +} + +/* + * free_design_setup_data: free allocated design setup data + */ +void +free_design_setup_data (TGalleryDesign *design) +{ + if (design) { + g_list_foreach (design->image_sizes, (GFunc) free_image_size_data, NULL); + g_list_free (design->image_sizes); + g_list_foreach (design->themes, (GFunc) free_design_theme_data, NULL); + g_list_free (design->themes); + g_strfreev (design->supplemental_files); + g_free (design); + } +} |
